package com.jayqqaa12.oauth2;

import org.apache.oltu.oauth2.common.exception.OAuthSystemException;

import com.jayqqaa12.Code;
import com.jayqqaa12.jbase.jfinal.ext.JsonExceptionInterceptor;
import com.jayqqaa12.jbase.jfinal.ext.ctrl.JsonController;
import com.jayqqaa12.jbase.jfinal.ext.spring.Inject;
import com.jayqqaa12.model.json.SendJson;
import com.jfinal.aop.Before;
import com.jfinal.ext.route.ControllerBind;

/***
 *   oauth2认证  实现
 * 
 * @author 12
 *
 */
@ControllerBind(controllerKey = "/oauth2")
public class OauthCtrl extends JsonController<Token> {
	@Inject.BY_TYPE
	Token tokenDao;
	@Inject.BY_TYPE
	Client clientDao;
	
	@Inject.BY_TYPE
	OauthLogin loginService; // spring 配置实现

	/**
	 * 授权 获得 token  这个接口只能给自己的应用使用 
	 * 第三方应用 应该使用auth+ accessToken接口
	 * 
	 * 不返回code 是因为直接返回 json数据了 跟 web形式有所不同 传入数据 client_id client_secret
	 * 不验证 null的参数 使用 拦截器 统一处理
	 * @throws OAuthSystemException
	 * 
	 */
	@Before(JsonExceptionInterceptor.class)
	public void token() throws OAuthSystemException {
		SendJson json = getJsonObject();
		String client_id = getPara("client_id");
		String client_secret = getPara("client_secret");

		// 1.check client
		if (clientDao.findClient(client_id, client_secret) != null) {
			String username = getPara("username");
			String pwd = getPara("pwd");
			// 2.check login
			json.code = loginService.login(username, pwd); // TODO 单点登录 可以修改一下 全部改成 分布式服务

			if (json.code == 200) {

				Token t = new Token().set("client_id", client_id).set("uid", username);
				String token = tokenDao.getToken(t);
				json.setData("token", token);
			}

		} else json.code = Code.OAUTH2_CLIENT_ERROR;

		sendJson(json);
	}
	
	
	/***
	 * 删除token
	 */
	public void remove(){
		tokenDao.delete(getPara("token"));
	}
	
	/**TODO
	 * web版本（包括客户端的网页）  需要先 auth 登录获取 code
	 * 然后 用code 获取 token
	 */
	public void auth() {
	}
	/**TODO
	 * 用code 获取 token
	 */
	public void accessToken(){
		
		
	}

}
